What is @multiformats/multiaddr?
@multiformats/multiaddr is a JavaScript implementation of the multiaddr format, which is a self-describing network address format. It is used to represent addresses in a way that is protocol-agnostic and can be easily extended to support new protocols.
What are @multiformats/multiaddr's main functionalities?
Create a Multiaddr
This feature allows you to create a new multiaddr instance from a string. The example demonstrates creating a multiaddr for an IPv4 address with a TCP port.
const multiaddr = require('@multiformats/multiaddr');
const addr = multiaddr('/ip4/127.0.0.1/tcp/4001');
console.log(addr.toString());
Parse a Multiaddr
This feature allows you to parse a multiaddr and extract protocol names. The example shows how to get the protocol names from a multiaddr.
const multiaddr = require('@multiformats/multiaddr');
const addr = multiaddr('/ip4/127.0.0.1/tcp/4001');
console.log(addr.protoNames());
Encapsulate and Decapsulate
This feature allows you to encapsulate and decapsulate addresses. The example demonstrates adding a UDP layer to an existing address and then removing it.
const multiaddr = require('@multiformats/multiaddr');
const addr = multiaddr('/ip4/127.0.0.1/tcp/4001');
const encapsulated = addr.encapsulate('/udp/1234');
console.log(encapsulated.toString());
const decapsulated = encapsulated.decapsulate('/udp');
console.log(decapsulated.toString());
Other packages similar to @multiformats/multiaddr
ip
The 'ip' package provides utilities for IP address manipulation, including parsing and formatting. While it focuses on IP addresses specifically, @multiformats/multiaddr is more versatile, supporting a wider range of protocols and encapsulation.
netaddr
The 'netaddr' package is used for network address manipulation, including IP and CIDR operations. It is similar in functionality to 'ip', but @multiformats/multiaddr offers a more comprehensive approach to handling multi-protocol addresses.
@multiformats/multiaddr
multiaddr implementation (binary + string representation of network addresses)
About
A standard way to represent addresses that
- support any standard network protocol
- are self-describing
- have a binary packed format
- have a nice string representation
- encapsulate well
Example
import { multiaddr } from '@multiformats/multiaddr'
const addr = multiaddr('/ip4/127.0.0.1/udp/1234')
addr.bytes
addr.toString()
addr.protos()
addr.nodeAddress()
addr.encapsulate('/sctp/5678')
Resolving DNSADDR addresses
DNSADDR is a spec that allows storing a TXT DNS record that contains a Multiaddr.
To resolve DNSADDR addresses, call the .resolve()
function the multiaddr, optionally passing a DNS
resolver.
DNSADDR addresses can resolve to multiple multiaddrs, since there is no limit to the number of TXT records that can be stored.
Example - Resolving DNSADDR Multiaddrs
import { multiaddr, resolvers } from '@multiformats/multiaddr'
import { dnsaddrResolver } from '@multiformats/multiaddr/resolvers'
resolvers.set('dnsaddr', dnsaddrResolver)
const ma = multiaddr('/dnsaddr/bootstrap.libp2p.io')
const resolved = await ma.resolve({
signal: AbortSignal.timeout(5000)
})
console.info(resolved)
Example - Using a custom DNS resolver to resolve DNSADDR Multiaddrs
See the docs for @multiformats/dns for a full breakdown of how to specify multiple resolvers or resolvers that can be used for specific TLDs.
import { multiaddr } from '@multiformats/multiaddr'
import { dns } from '@multiformats/dns'
import { dnsJsonOverHttps } from '@multiformats/dns/resolvers'
const resolver = dns({
resolvers: {
'.': dnsJsonOverHttps('https://cloudflare-dns.com/dns-query')
}
})
const ma = multiaddr('/dnsaddr/bootstrap.libp2p.io')
const resolved = await ma.resolve({
dns: resolver
})
console.info(resolved)
Install
$ npm i @multiformats/multiaddr
Browser <script>
tag
Loading this module through a script tag will make it's exports available as MultiformatsMultiaddr
in the global namespace.
<script src="https://unpkg.com/@multiformats/multiaddr/dist/index.min.js"></script>
API Docs
License
Licensed under either of
Contribution
Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.